package com.wisely.ch9_1.config;

import com.wisely.ch9_1.security.CustomUserService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;

//1
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

	//2
	@Bean
	UserDetailsService customUserService() {
		return new CustomUserService();
	}

	/**
	 * 1、用户认证
	 * 认证（Authentication）需要我们有一套用户数据来源，而授权（Authorization）则是对某个有相应的角色权限。
	 * Spring Security通过重写protected void configure(AuthenticationManagerBuilder auth) 方法来实现定制。
	 *
	 * @param auth
	 * @throws Exception
	 */
	@Override
	protected void configure(AuthenticationManagerBuilder auth) throws Exception {
		//3
		auth.userDetailsService(customUserService());

	}

	/**
	 * 2、请求授权
	 * Spring Security通过重写protected void configure(HttpSecurity http) 方法来实现请求拦截的。
	 * 2.1、anyRequest()：匹配所有请求路径。
	 * 2.2、使用以下匹配器来匹配请求路径：
	 * 2.2.1、antMatcher()
	 * 2.2.2、regexMatcher()
	 * <p>
	 * 2.3、permitAll()用户可任意访问
	 * 2.4、authenticated()用户登录后可访问
	 * 2.5、anonymous()匿名可访问
	 *
	 * @param http
	 * @throws Exception
	 */
	@Override
	protected void configure(HttpSecurity http) throws Exception {
		//通过authorizeRequests方法来开始请求权限配置
		http.authorizeRequests()
				.anyRequest().authenticated() //4、其余所有请求都需要认证后（登录后）才可以访问
				.and()
				//通过formLogin方法定制登陆操作。
				.formLogin()
				//通过loginPage方法定制登录页面的访问路径
				.loginPage("/login")
				.failureUrl("/login?error")
				.permitAll() //5
				.and()
				.logout().permitAll(); //6


	}


}
